package com.anmong.parser.service;

import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

@Service
public class NovelFormattingService {

    // 定义用于结束一个“句子单元”的标点
    private static final Set<Character> SENTENCE_TERMINATORS = new HashSet<>(
            Arrays.asList('。', '，', '！', '？', '；', '…', '”', '』'));

    public String format(String novelText) {
        if (novelText == null || novelText.isEmpty()) {
            return "";
        }

        // 步骤 1: 预处理，创建干净、连续的文本流
        String continuousText = novelText.trim().replaceAll("[\\s　]+", " ");

        int totalLength = continuousText.length();
        int part1EndIndex = (int) (totalLength * 0.1);
        int part2EndIndex = (int) (totalLength * 0.5);

        StringBuilder formattedText = new StringBuilder();
        int mainCursor = 0;

        while (mainCursor < totalLength) {
            // 步骤 2: 根据当前光标位置，确定本行的长度规则
            int minLineLength, maxLineLength;
            if (mainCursor < part1EndIndex) {
                minLineLength = 5;
                maxLineLength = 10;
            } else if (mainCursor < part2EndIndex) {
                minLineLength = 10;
                maxLineLength = 30;
            } else {
                minLineLength = 30;
                maxLineLength = 50;
            }

            // 步骤 3: 构建当前行
            StringBuilder currentLine = new StringBuilder();
            int tempCursor = mainCursor; // 使用临时光标进行本行的构建

            while (true) {
                if (tempCursor >= totalLength) {
                    break;
                }

                // 跳过前一个单元留下的行首空格
                if (currentLine.length() > 0 && tempCursor < totalLength && continuousText.charAt(tempCursor) == ' ') {
                    tempCursor++;
                }
                if (tempCursor >= totalLength) break;

                // 步骤 4: 获取下一个不可分割的单元（一个完整对话 或 一个叙述短句）
                String nextUnit;
                int endOfUnit;

                if (continuousText.charAt(tempCursor) == '“') {
                    // 单元是对话
                    int endQuoteIndex = continuousText.indexOf('”', tempCursor + 1);
                    endOfUnit = (endQuoteIndex != -1) ? endQuoteIndex + 1 : totalLength;
                } else {
                    // 单元是叙述，找到下一个标点作为结尾
                    endOfUnit = -1;
                    for (int i = tempCursor; i < totalLength; i++) {
                        if (SENTENCE_TERMINATORS.contains(continuousText.charAt(i)) || continuousText.charAt(i) == '“') {
                            endOfUnit = (SENTENCE_TERMINATORS.contains(continuousText.charAt(i))) ? i + 1 : i;
                            break;
                        }
                    }
                    if (endOfUnit == -1) { // 如果到最后都没有标点
                        endOfUnit = totalLength;
                    }
                }
                nextUnit = continuousText.substring(tempCursor, endOfUnit);

                // 步骤 5: 决策 - 是否将这个单元添加到当前行
                boolean isFirstUnit = currentLine.length() == 0;
                // 计算添加后的长度（+1 是为了空格）
                int lengthAfterAdd = currentLine.length() + (isFirstUnit ? 0 : 1) + nextUnit.length();

                if (isFirstUnit) {
                    // 第一个单元必须加，无论多长
                    currentLine.append(nextUnit);
                    tempCursor = endOfUnit;
                } else if (lengthAfterAdd <= maxLineLength) {
                    // 添加后不超过最大长度，可以安全添加
                    currentLine.append(" ").append(nextUnit);
                    tempCursor = endOfUnit;
                } else {
                    // 添加后会超长，则当前行构建结束
                    break;
                }

                // 如果当前行已超过最小长度，并且下一个单元是长对话，则主动结束本行，让长对话单独开始
                if (currentLine.length() >= minLineLength && tempCursor < totalLength && continuousText.charAt(tempCursor) == '“') {
                    int endQuoteIndex = continuousText.indexOf('”', tempCursor + 1);
                    if(endQuoteIndex !=-1 && (endQuoteIndex-tempCursor) > 15) { // 定义长对话阈值为15
                        break;
                    }
                }
            }

            if (currentLine.length() > 0) {
                formattedText.append(currentLine.toString()).append("\n");
                mainCursor = tempCursor; // 只有在输出一行后，才真正移动主光标
            } else {
                // 防止因空行导致死循环
                break;
            }
        }

        return formattedText.toString();
    }
}